/**
 * 区服消息广播功能测试
 * 测试WebSocket消息发送和广播功能
 */

const WebSocket = require('ws');

// 测试配置
const WS_URL = 'ws://localhost:3000/user-service/websocket';
const TEST_TOKEN = 'test_token_123'; // 测试用token

// 测试消息数据
const testMessages = [
    {
        name: '区频道消息测试',
        data: {
            c: 260,
            d: {
                t: 1, // 区频道
                c: '大家好，这是一条区频道测试消息！',
                areaId: 1
            }
        }
    },
    {
        name: '帮派频道消息测试',
        data: {
            c: 260,
            d: {
                t: 4, // 帮派频道
                c: '帮派成员们，这是一条帮派频道测试消息！',
                factionId: 1
            }
        }
    },
    {
        name: '商屏消息测试',
        data: {
            c: 260,
            d: {
                t: 5, // 商屏
                c: '全服公告：这是一条商屏测试消息！'
            }
        }
    }
];

// 创建WebSocket连接
function createConnection() {
    return new Promise((resolve, reject) => {
        const ws = new WebSocket(WS_URL);

        ws.on('open', () => {
            console.log('✅ WebSocket连接已建立');

            // 发送认证消息
            const authMessage = {
                c: 1, // 认证指令
                d: {
                    token: TEST_TOKEN
                }
            };

            ws.send(JSON.stringify(authMessage));
        });

        ws.on('message', (data) => {
            try {
                const message = JSON.parse(data.toString());
                console.log('📨 收到消息:', JSON.stringify(message, null, 2));

                // 如果是认证成功消息，解析resolve
                if (message.act_id === 1 && message.code === 0) {
                    console.log('✅ 认证成功');
                    resolve(ws);
                }
            } catch (error) {
                console.error('❌ 解析消息失败:', error);
            }
        });

        ws.on('error', (error) => {
            console.error('❌ WebSocket连接错误:', error);
            reject(error);
        });

        ws.on('close', () => {
            console.log('🔌 WebSocket连接已关闭');
        });

        // 设置超时
        setTimeout(() => {
            reject(new Error('连接超时'));
        }, 10000);
    });
}

// 测试消息发送
async function testMessageSending(ws) {
    console.log('\n🚀 开始测试消息发送...');

    for (const testMessage of testMessages) {
        console.log(`\n📤 发送${testMessage.name}:`);
        console.log('发送数据:', JSON.stringify(testMessage.data, null, 2));

        try {
            ws.send(JSON.stringify(testMessage.data));

            // 等待响应
            await new Promise(resolve => setTimeout(resolve, 2000));

        } catch (error) {
            console.error(`❌ 发送${testMessage.name}失败:`, error);
        }
    }
}

// 主测试函数
async function runTest() {
    console.log('🧪 开始区服消息广播功能测试...\n');

    try {
        // 建立连接
        const ws = await createConnection();

        // 等待一下确保连接稳定
        await new Promise(resolve => setTimeout(resolve, 1000));

        // 测试消息发送
        await testMessageSending(ws);

        // 等待一段时间观察广播效果
        console.log('\n⏳ 等待广播消息...');
        await new Promise(resolve => setTimeout(resolve, 5000));

        // 关闭连接
        ws.close();
        console.log('\n✅ 测试完成');

    } catch (error) {
        console.error('❌ 测试失败:', error);
    }
}

// 运行测试
if (require.main === module) {
    runTest();
}

module.exports = { runTest, createConnection, testMessageSending };
